//
//  main.m
//  04_集合2
//
//  Created by dllo on 16/7/7.
//  Copyright © 2016年 yh. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Contact.h"
#import "ContactManager.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 1. 字典
        // 存储键值对(key - value)的集合类型
        // 字典存储数据是无序的
        // 通过key值存储 查找value
        // 1> 初始化
        // 先value 后key
        // 字典中只能存放对象类型
        // 如果有数字 将数字转化为NSNumber类型

        // 不可变字典
        NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"tantan", @"name", [NSNumber numberWithInt:18], @"age", @"tantan", @"firstName", nil];
        
        // 2> 构造器
        NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"jiajia", @"name", [NSNumber numberWithInt:20], @"age", nil];
        
        // 3> 字面量 先 key 后value (数字为NSNumber类型)
        NSDictionary *dic2 = @{@"name": @"zhengyu", @"age": @(20), @"sex": @"man"};
        
        // 4> 取值 通过key值取对应的value
        NSString *str =  [dic2 objectForKey:@"name"];
        NSLog(@"%@", str);
        
        // 5> 获取所有key值
        NSArray *keyArr = [dic2 allKeys];
        NSLog(@"%@", keyArr);
        
        // 6> 获取所有value
        NSArray *valueArr = [dic2 allValues];
        NSLog(@"%@", valueArr);
        
        // 7> count 与key 或 value的个数相同
        NSUInteger count = [dic2 count];
        NSLog(@"%ld", count);
        
        // 8> 通过一个字典的key 取另一个字典中对应value数组
        NSArray *allValueArr = [dic objectsForKeys:dic2.allKeys notFoundMarker:[NSNumber class]];
        NSLog(@"%@", allValueArr);
        
        // 9> 有可能两个相同的value 对应的key不同 用下面的方法就可以查找出所有不同的key 将这些key 放到一个数组里
        NSArray *keyArray = [dic allKeysForObject:@"tantan"];
        NSLog(@"%@", keyArray);
        
        // 10> dic[@"name"]; (语法糖) dic[key]
        NSLog(@"%@", dic1[@"name"]);

        // 可变字典
        // 1> 可变字典初始化方式 (不推荐使用字面量)
        NSMutableDictionary *mutDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"yuhan", @"name", @"man", @"sex", @"18", @"age", nil];
        NSMutableDictionary *mutDic1 = [[NSMutableDictionary alloc] init];
        // NSMutableDictionary *mutDic = [@{} mutableCopy]; (不推荐)
        // 2> 取值与不可变 相同
        // 3> 可变字典可以进行増 删 改 操作
        //    1. 给字典添加键值对 用setObject: forKey:  如果新增加的key存在 会将之前的value覆盖 如果key不存在 会使字典增加一个键值对1
        [mutDic setObject:@"yuhan" forKey:@"name"];
        [mutDic1 setObject:@"man" forKey:@"sex"];
        NSLog(@"%@, %@", mutDic, mutDic1);
        
        //    2. 删除字典中的键值对
        [mutDic removeObjectForKey:@"name"];
        NSLog(@"%@", mutDic);
        [mutDic removeAllObjects];
        NSLog(@"%@", mutDic);
        //    3. 语法糖 赋值 与 字典添加键值对作用一样 可以向字典里添加键值对 也可以从字典里取 值
        mutDic[@"where"] = @"huludao";
        mutDic[@"birth"] = @"1993";
        mutDic[@"study"] = @"college";
        NSLog(@"%@", mutDic);
        NSLog(@"%@", mutDic[@"where"]);

        
        // 练习
        //        完成以下需求
        //        需求：1、定义联系人类Contact。实例变量：姓名(拼音，首字母大写)、性别、电话号码、住址、分组名称、年龄。方法：自定义初始化方法(姓名、电话号码)、显示联系人信息。
        //        2、在main.m中定义字典，分组管理所有联系人。分组名为26个大写的英文字母。
        //        3、可以添加联系人对象，如果姓名或电话号码为空，添加失败。添加联系人到匹配的分组。
        //        4、删除某个分组的全部联系人。
        Contact *contact1 = [[Contact alloc] initWithName:@"Zhaohao" phoneNumber:@"1832468"];
        Contact *contact2 = [[Contact alloc] initWithName:@"Liangchaowei" phoneNumber:@"1830423"];
        Contact *contact3 = [[Contact alloc] initWithName:@"Wuyanzu" phoneNumber:@"4232468"];
        contact1.groupName = @"Z";
        contact2.groupName = @"L";
        contact3.groupName = @"W";
        [contact1 showContact];
        
        NSMutableDictionary *contactDic = [NSMutableDictionary dictionary];
/**
        // key: A - Z value: 可变数组
        // 判断名字和手机号 是不是空的 如果都不是空的 就可以添加了 否则添加失败
        if (contact1.name.length > 0 && contact1.phoneNumber.length > 0) {
            // 根据分组名取到联系人的数组
            NSMutableArray *contactArray = [contactDic objectForKey:contact1.groupName];
            // 如果不存在 创建一个数组
            if (contactArray == nil) {
                // 初始化数组
                contactArray = [NSMutableArray array];
                [contactArray addObject:contact1];
                [contactDic setObject:contactArray forKey:contact1.groupName];
            } else {
                // 存在就直接添加
                [contactArray addObject:contact1];
                // 这一步 可以没有 因为这个数组是从字典里提取出来的 所以这个数组已经在字典里了
                [contactDic setObject:contactArray forKey:contact1.groupName];
            }
            NSLog(@"添加联人%@成功", contact1.name);
        } else {
            NSLog(@"添加联系人%@失败", contact1.name);
        }
*/
        ContactManager *manager = [[ContactManager alloc] initWithDic:contactDic];
        [manager addContact:contact1];
        [manager addContact:contact2];
        [manager addContact:contact3];
        
        NSLog(@"%@", contactDic);
        // 删除分组
        [manager delGroupContact:contact1.groupName];
        NSLog(@"%@", contactDic);
        
        // 将数字转化为字符串
        [@10 description];
/**
        // 2. 集合
        // NSSet 不可变 可变
        // 不可变集合
        // 1> 初始化 在数组中如果出现两个一样的元素 会显示两个 而在集合中如果有两个相同元素 只会显示一个 集合存在互异性(无重复的元素) 集合是无序的
        NSSet *set = [[NSSet alloc] initWithObjects:@"zhaohao", @"zhaohao", nil];
        NSLog(@"%@", set);
        // 2> 构造器
        NSSet *set1 = [NSSet setWithObjects:@"zhaohao", @"zhaohao", @"lalalala", @"huaidan", @"xiaopangzi",nil];
        // 3> 系统没有提供集合的字面量
        // 4> 集合的取值 任意取一个元素
        NSLog(@"%@", [set1 anyObject]);
        // 5> count
        NSLog(@"%ld", [set1 count]);
        NSArray *repeatArray = @[@"7", @"8", @"3", @"1", @"7", @"5", @"7"];
        NSSet *repeatSet = [NSSet setWithArray:repeatArray];
        NSLog(@"%@", repeatSet);
        
        // 可变集合
        // 1> 初始化 与不可变一样 系统未提供字面量
        // 2> 取值 anyObject
        // 3> 増 删 改
        //    1. 添加 删除
        NSMutableSet *mutSet = [NSMutableSet set];
        [mutSet addObject:@"zhaohao"];
        [mutSet removeObject:@"zhaohao"];
        NSLog(@"%@", mutSet);
*/
        
    }
    return 0;
}

